功能
- 使用
CMakeLists.txt
文件来描述项目如何构建,能够跨平台构建项目,并更好地处理依赖关系
实现
目录结构
CMakeLists.txt
:构建关系文件src/
:源文件bulid/
:编译目录
CMakeLists
- 最低版本要求:
cmake_minimum_required(VERSION 3.1)
- 设置项目:
project()
- 项目名称
- 项目版本
- 项目描述
- 项目语言
project(MyProject VERSION 1.0 // 项目名称和项目版本
DESCRIPTION "Very nice project" // 项目描述
LANGUAGES CXX) // 项目语言
- 添加可执行文件(.exe):
add_executable()
- 可执行文件名称
- 源文件列表
- 生成库:`add_library()
- 库名称
- 库类型
- 静态库:
STATIC
,静态库在编译时会被链接到最终的可执行文件中 - 动态库(.dll):
SHARE
,动态库会在运行时被加载
- 静态库:
- 源文件列表
- 指定目标的包含目录:
target_include_directories(<target_name><include_type><include_path>)
- 目标名称
- 包含目录类型
PUBILC
:指定的包含目录和编译选项不仅会被用于当前目标,还会被传递给所有依赖于当前目标的其他目标PRIVATE
:指定的包含目录和编译选项只会被用于当前目标,不会被传递给依赖于当前目标的其他目标INTERFACE
:指定只有当其他目标依赖于当前目标时才会使用的属性。这些属性不会用于当前目标本身
- 包含目录路径
- 为目标添加链接库:
target_link_libraries(<target_name><link_type><link_name>)
- 输出目录控制:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
- 保存目录文件到变量:`aux_source_directory(
) - 查找并配置外部依赖库或软件包:
find_package(<PackageName> [version] [REQUIRED] [QUIET] [OPTIONAL_COMPONENTS <component1> <component2>])
<PackageName>
:要查找的包的名称,通常是你要依赖的库或工具。version
:可选,指定要找到的包的版本。REQUIRED
:可选,表示如果找不到指定的包,CMake 会生成错误并停止配置。如果没有设置,找不到包时会产生警告。QUIET
:可选,表示如果找不到包,则不会显示警告。OPTIONAL_COMPONENTS
:可选,指定要查找的包的子组件。
cmake_minimum_required(VERSION 3.29.0)# 设置cmake最低版本
project(planning) # 设置项目名称
set(CMAKE_CXX STANDARD 17) # 指定 CMake 使用 C++17 标准来编译 C++ 源文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # 指定输出目录
aux_source_directory(${PROJECT SOURCE DIR}/src SRC_LISTS) # 使用SRC_LISTS保存根目录下src文件夹中文件
# 使用src中文件,创建动态库common
add library(common
SHARED
${SRC_LISTS}
)
#为common动态库包含include目录
target_include_directories(common
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
add_executable(planning_main planning_main.cpp) # 使用planning_main.cpp,创建可执行文件planning_main.exe
# 为planning main可执行文件包含include目录
target_include_directories(planning main
PUBLIC
${PROJECT SOURCE DIR}/include
)
# 为planning main可执行文件链接common动态库
target_link_libraries(planning main
PUBLIC
common
)
构建项目
~/package $ cmake -S . -B build -G "MinGW Makefiles" # 指定源码为当前目录,并在build目录下生成构建系统所需文件,指定使用MinGW
~/package $ cmake --build build # 在build目录下执行编译过程,将源码编译成可执行文件
细节
概念解释
- 目标:
- 包含目录:告诉编译器在哪里可以找到头文件的目录
- 链接库:告诉链接器在最终生成可执行文件或库文件时需要链接哪些库
Last updated on